#include "Label.h"

using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Label::Label()
{
	Init();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Label::Label(const GUIString &theText)
{
	Init();
	mVertAlign = VertAlign_Center;
	SetText(theText,false);
	SetDesiredSize();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::Init()
{
	mTextColor = ColorScheme::GetColorRef(StandardColor_ButtonText);
	mHorzAlign = HorzAlign_Left;
	mVertAlign = VertAlign_Top;

	mText = new WrappedText;
	mText->SetFont(GetNamedFont("Label"));
	mText->SetWrap(false);

	mLeftPad = mRightPad = mTopPad = mBottomPad = 0;
	mAdjustHeightToFitText = false;
	SetComponentFlags(ComponentFlag_Clip,true);

	mBackground.SetColor(-1);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SetMaxWidth()
{
	int aWidth = Width()-mLeftPad-mRightPad;
	if(aWidth<0)
		aWidth = 5;

	mText->SetMaxWidth(aWidth);
	AdjustHeightToFitText();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Label::~Label()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SizeChanged()
{
	Component::SizeChanged();
	SetMaxWidth();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SetHorzAlign(HorzAlign theAlign)
{
	mHorzAlign = theAlign;
	mText->SetCentered(theAlign==HorzAlign_Center);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SetText(const GUIString &theText, bool invalidate) 
{ 
//	mText = theText;
	mText->SetText(theText);
	AdjustHeightToFitText();
	if(invalidate)
		Invalidate();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SetRichText(const GUIString &theText, bool invalidate)
{
	mText->SetRichText(theText, mTextColor);
	if(invalidate)
		Invalidate();
}


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::AdjustHeightToFitText()
{
	if(!mAdjustHeightToFitText)
		return;

	if(Height()-mTopPad-mBottomPad!=mText->GetHeight())
		SetSize(Width(),mText->GetHeight()+mTopPad+mBottomPad);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SetAdjustHeightToFitText(bool adjust)
{
	if(adjust==mAdjustHeightToFitText)
		return;

	mAdjustHeightToFitText = adjust;
	AdjustHeightToFitText();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::SetWrap(bool wrap) 
{ 
	mText->SetWrap(wrap); 
	AdjustHeightToFitText();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::GetDesiredSize(int &width, int &height)
{
	width = mText->GetWidth() + mLeftPad + mRightPad;
	height = mText->GetHeight() + mTopPad + mBottomPad;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Label::Paint(Graphics &g)
{
	Component::Paint(g);

	int x = 0, y = 0;

	mBackground.Paint(g,0,0,Width(),Height());

	int aTextWidth = mText->GetWidth();
	int aTextHeight = mText->GetHeight();
	int aWidth = Width() - mLeftPad - mRightPad;
	int aHeight = Height() - mTopPad - mBottomPad;

	switch(mHorzAlign)
	{
		case HorzAlign_Left: x = 0; break;
		case HorzAlign_Center: x = (aWidth-aTextWidth)/2; break;
		case HorzAlign_Right: x = aWidth-aTextWidth; break;
	}

	switch(mVertAlign)
	{
		case VertAlign_Top: y = 0; break;
		case VertAlign_Center: y = (aHeight-aTextHeight)/2; break;
		case VertAlign_Bottom: y = aHeight-aTextHeight; break;
	}

	x+=mLeftPad;
	y+=mTopPad;


	g.SetColor(mTextColor);
	mText->Paint(g,x,y);
//	g.SetFont(mFont);
//	g.DrawString(mText,x,y);

}
